// 云函数入口文件
const cloud = require('wx-server-sdk')

cloud.init({
  env: cloud.DYNAMIC_CURRENT_ENV
})

const db = cloud.database()
const gameRecordsCollection = db.collection('gameRecords')
const MAX_LIMIT = 100

// 云函数入口函数
exports.main = async (event, context) => {
  const { action, data } = event

  switch (action) {
    case 'add':
      return await addGameRecord(data)
    case 'get':
      return await getGameRecords(data)
    case 'getLeaderboard':
      return await getLeaderboard(data)
    case 'getById':
      return await getGameRecordById(data)
    default:
      return {
        code: -1,
        msg: '未知操作类型'
      }
  }
}

/**
 * 添加游戏记录
 * @param {Object} data 游戏记录数据
 */
async function addGameRecord(data) {
  try {
    // 添加创建时间
    const record = {
      ...data,
      createTime: db.serverDate()
    }

    const result = await gameRecordsCollection.add({
      data: record
    })

    return {
      code: 0,
      msg: '添加游戏记录成功',
      data: result
    }
  } catch (error) {
    console.error('添加游戏记录失败', error)
    return {
      code: -1,
      msg: '添加游戏记录失败: ' + error.message,
      error
    }
  }
}

/**
 * 获取游戏记录列表
 * @param {Object} data 查询参数
 */
async function getGameRecords(data = {}) {
  try {
    const { userId, limit = 20, skip = 0 } = data
    let query = gameRecordsCollection.orderBy('createTime', 'desc')

    // 如果有用户ID，则只查询该用户的记录
    if (userId) {
      query = query.where({
        'userId': userId
      })
    }

    const result = await query.limit(limit).skip(skip).get()

    return {
      code: 0,
      msg: '获取游戏记录成功',
      data: result.data
    }
  } catch (error) {
    console.error('获取游戏记录失败', error)
    return {
      code: -1,
      msg: '获取游戏记录失败: ' + error.message,
      error
    }
  }
}

/**
 * 获取排行榜数据
 * @param {Object} data 查询参数
 */
async function getLeaderboard(data = {}) {
  try {
    const { limit = 20, skip = 0 } = data

    // 查询有获胜者的记录，并按照获胜者的金钱数量降序排列
    const result = await gameRecordsCollection
      .where({
        'winner.money': db.command.exists(true)
      })
      .orderBy('winner.money', 'desc')
      .limit(limit)
      .skip(skip)
      .get()

    return {
      code: 0,
      msg: '获取排行榜成功',
      data: result.data
    }
  } catch (error) {
    console.error('获取排行榜失败', error)
    return {
      code: -1,
      msg: '获取排行榜失败: ' + error.message,
      error
    }
  }
}

/**
 * 根据ID获取游戏记录详情
 * @param {Object} data 包含记录ID
 */
async function getGameRecordById(data) {
  try {
    const { id } = data
    if (!id) {
      return {
        code: -1,
        msg: '记录ID不能为空'
      }
    }

    const result = await gameRecordsCollection.doc(id).get()
    
    return {
      code: 0,
      msg: '获取游戏记录详情成功',
      data: result.data
    }
  } catch (error) {
    console.error('获取游戏记录详情失败', error)
    return {
      code: -1,
      msg: '获取游戏记录详情失败: ' + error.message,
      error
    }
  }
}